﻿using System.Collections.Generic;
using System.Linq;

using Insesoft.Entities;
using NHibernate;
using NHibernate.Linq;

namespace InseSoft.UIControllers
{
    public class IngresoController : Controller
    {
        #region Declarations

        private readonly IList<Usuario> usuarios = new List<Usuario>();

        #endregion

        #region Constructors

        public IngresoController(){ }

        public IngresoController(ISession session) : base(session) { }

        #endregion

        #region Methods: Public

        public Usuario GetUserByName(Empresa empresa, string nombreUsuario)
        {
            var usuario = FindInCache(empresa, nombreUsuario);
            if (usuario == null)
            {
                usuario = GetByUsuario(empresa, nombreUsuario);
                AddToCache(usuario);
            }
            return usuario;
        }

        public bool Autenticar(Empresa empresa, string nombreUsuario, string clave)
        {
            var usuario = GetUserByName(empresa, nombreUsuario);
            if (usuario != null)
                return usuario.Clave == clave;
            return false;
        }

        #endregion

        #region Methods: Non-Public

        private Usuario GetByUsuario(Empresa empresa, string nombreUsuario)
        {
            var usuario = (from u in Session.Query<Usuario>()
                           where u.Empresa == empresa && u.NombreUsuario == nombreUsuario
                           select u).SingleOrDefault();
            return usuario;
        }

        private Usuario FindInCache(EntidadBase empresa, string nombreUsuario)
        {
            return usuarios.FirstOrDefault(item => item.Empresa.Id == empresa.Id && item.NombreUsuario == nombreUsuario);
        }

        private void AddToCache(Usuario usuario)
        {
            if (!usuarios.Contains(usuario))
                usuarios.Add(usuario);
        }

        #endregion
    }
}
